// --- BigInteger ---


/*
在Java中,由CPU原生提供的整型最大范围是64bit的long型Integer。
使用‘long型整数’可以直接通过CPU指令进行计算,速度非常快。

Q:如果我们使用的整数范围超过了long型怎么办?
A:这个时候,就只能用软件来模拟一个‘大整数’。java.math.BigInteger就是用来表示任意大小的整数。BigInteger内部用一个int[]数组来模拟一个非常大的整数: */
BigInteger b = new BigInteger("1234567890")
System.out.println(b.pow(5)); //2867971860299718107233761438093672048294900000
	//b.pow(5);  返回b的5次方的结果。

//对BigInteger做运算的时候,只能使用Instance Method,例如:加法运算
BigInteger b1 = new BigInteger("1234567890");
BigInteger b2 = new BigInteger("12345678901234567890");
BigInteger sum = b1.add(b2); //12345678902469135780

//和long整型数相比,BigInteger不会有范围限制,但缺点是速度比较慢。

//也可以将BigInteger转换为long型
BigInteger b = new BigInteger("123456789000");
System.out.println(b.longValue()); //123456789000
System.out.println(i.multiply(i).longValueExact()); //java.lang.ArithmeticException:BigInteger out of long range


//使用longValueExact()方法时,如果超出了long型的范围,会抛出AirthmeticException。

/*
BigInteger和Integer、Long一样,也是‘不可变类’,并且也继承自Number类。因为Number定义了转换为基本类型的几个方法:
	1.转换为byte: byteValue()
	2.转换为short: shortValue()
	3.转换为int: intValue()
	4.转换为long: longValue()
	5.转换为float: floatValue()
	6.转换为double: doubleValue()

因此,通过上述方法,可以把BigInteger转换为‘基本类型’。如果BigInteger表示的数据的范围超过了基本类型的范围,转换时将丢失高位信息,即结果会有,但不准确(被裁切高位)。如果需要准确地转换成基本类型,可以使用intValueExact()、longValueExact()等方法,在转换时,如果超出了数据结构范围,将抛出'AirthmeticException'Error

Arithmetic n. 算术;算术运算;算法;运算;算数

*/

//如果BigInteger的值,甚至超过了float的最大范围(3.4x10^38),那么float返回的是什么呢？
import java.math.BigInteger;

public class Main {
	public static void main(String[] args) {
		BigInteger n = new BigInteger("999999").pow(99);
		float f = n.floatValue();
		System.out.println(f); // have a try~
	}
}


/* ## BigInteger小结 ## 

1.BigInteger用于表示任意大小的整数;

2.BigInteger是‘不变类(final class)’,并继承自class Number

3.将BigInteger转换成基本类型时,可以使用longValueExact()等方法保证结果的准确性。


*/ 